package 测试问题;

import org.checkerframework.checker.units.qual.A;

/**
 * @className: DemoStudy
 * @author: xl
 * @date: 2025/7/17 07:38
 * @Version: 1.0
 * @description:
 */

public class DemoStudy {

    public static void main(String[] args) {


        //写一个斗地主的程序




        /**
         * 命名方式
         *  1、包的命名：com.example.demo 全部小些
         *  2、类的命名：DemoStudy 遵循大小写驼峰命名法
         *  3、方法命名 demo 遵循大小写驼峰命名法，但首字母小写
         *  4、变量命名 test 遵循大小写驼峰命名法，但首字母小些
         *  5、常量命名 TEST 遵循大小写驼峰命名法，全部大写
         */


        /**
         * 基本数据类型的转换
         *  1、显示转换、隐式转换
         *
         * 引用数据类型转换
         *  1、自动装箱 、自动拆箱
         *
         * 继承关系直接对象转换
         *  1、向上转型、向下转型
         */


        /**
         * 运算符
         *  1、算术运算符
         *  2、关系运算符
         *  3、逻辑运算符
         *  4、位运算符
         *  5、赋值运算符
         *  6、三木运算符
         *
         */


        for (int i = 0; i < 100; i++) {
            System.out.println(i+"的因子个数是："+countFactors(i));;


        }
    }


    /**
     * 这是一个很好的数学原理问题。让我来详细解释为什么只需要检查到 sqrt(num)：
     * 数学原理说明
     * 当判断一个数 num 是否为素数时，我们只需要检查到 sqrt(num)，原理如下：
     * 因数配对原理
     * 如果 num 有一个因数 a，且 a > sqrt(num)，那么必然存在另一个因数 b = num/a，且 b < sqrt(num)
     * 这是因为 a * b = num，如果 a > sqrt(num)，则 b = num/a < num/sqrt(num) = sqrt(num)
     * 具体示例
     * 以数字 36 为例，sqrt(36) = 6
     * 因数对有：(1,36), (2,18), (3,12), (4,9), (6,6)
     * 注意到当一个因数超过6时，另一个因数必然小于6
     * 所以我们只需要检查到6即可找到所有可能的因数
     * 算法优化原理
     * 如果 num 是合数，那么它至少有一个因数小于等于 sqrt(num)
     * 如果在 [2, sqrt(num)] 范围内没有找到因数，那么在 [sqrt(num), num-1] 范围内也不会有因数
     * 因此只需检查到 sqrt(num) 就足够判断是否为素数
     * @param num
     * @return
     */
    public static boolean isPrime(int num) {
        if (num <= 1) return false;
        if (num <= 3) return true;
        if (num % 2 == 0) return false;

        // 只需检查到 sqrt(num)
        for (int i = 3; i * i <= num; i += 2) {
            if (num % i == 0) {
                return false; // 找到因数，不是素数
            }
        }
        return true; // 没有找到因数，是素数
    }


    /**
     * 计算一个数的因数个数
     * @param num 要计算因数个数的数
     * @return 因数的个数
     */
    public static int countFactors(int num) {
        if (num <= 0) {
            return 0;
        }

        int count = 0;
        for (int i = 1; i <= num; i++) {
            if (num % i == 0) {
                count++;
            }
        }
        return count;
    }



}